package com.atguigu.Threads;

import java.util.concurrent.locks.ReentrantLock;

/**
 * 方法二：使用接口Runnable实现多线程
 *
 * 生命周期：
 *  1.新建，即创建一个线程对象
 *  2.就绪，新建时期运行start()即进入就行时期，也可以sleep()时间到，join()结束，获得同步锁等进入，
 *  3.运行，就绪获得cpu的执行权进入运行时期，失去cpu的执行权和yield()就返回就绪时期
 *          sleep().join.同步锁，wait(),suspend()等情况进入阻塞状态
 *  4.死亡，运行run()结束，stop(),出现错误
 *
 *  线程安全：
 *      1.同步代码块，synchronized(obj){同步要执行的代码}
 *      1.1.obj为任意对象，但一个要是同一个对象，即同一把锁
 *      2.同步方法，使用syschronized修饰要操作的共享数据的方法
 *      2.1.实现runnable接口，之间修饰方法，同步监视器为this,当前对象
 *      2.2.继承Thread类，除了syschronized修饰之外还得用static修饰，当前同步监视器为当前主类.class即字节码文件
 *      3使用Lock对象，显示定义，保证线程安全
 *      3.1.lock()方法，锁住共享数据
 *      3.2.unlock()方法，释放共享数据
 * @author xiaoqi
 * @data 2021/04/04 20:35
 */
public class ThreadRunnableDemo {
    public static void main(String[] args) {
        ThreadRunnable t1 = new ThreadRunnable();

        //创建多个线程对象
        Thread w1 = new Thread(t1);
        Thread w2 = new Thread(t1);
        Thread w3 = new Thread(t1);
        //重命名
        w1.setName("窗口一");
        w2.setName("窗口二");
        w3.setName("窗口三");

//        //设置优先级
//        w2.setPriority(10);
//        w1.setPriority(4);
        //执行线程
        w1.start();
        w2.start();
        w3.start();
    }
}

//继承接口Runnable
class ThreadRunnable implements Runnable{
    private int ticket = 100;
    private ReentrantLock lock = new ReentrantLock(true);
    @Override
    public void run() {
        while (true) {
            try{
                lock.lock();
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + ":卖票，票号为" + ticket);
                    ticket--;
                } else {
                    break;
                }
            }
            finally {
                lock.unlock();
            }
//            synchronized (this) {
//                    if (ticket > 0) {
//                        System.out.println(Thread.currentThread().getName() + ":卖票，票号为" + ticket);
//                        ticket--;
//                    } else {
//                        break;
//                    }
//            }
        }
    }
}
